function [] = cfilewriter(filename, data, dtype, paraname, varargin)
%
%
if nargin==4
   mode="a";
else
    mode=varargin{1};
end
fp=fopen(filename,mode);
if dtype=="float"
    if size(data,1)==1||size(data,2)==1
        fprintf(fp,['float ',char(paraname),'[]=\n']);
        s=printfloatvec2char(data);
        fprintf(fp,s);
        fprintf(fp,';\n');
    elseif length(size(data))==2
        fprintf(fp,['float ',char(paraname),'[][%d]={\n'],size(data,2));
        s=[];
        for i=1:size(data,1)
            s=[s,printfloatvec2char(data(i,:)),',\n'];
        end
        s=[s(1:end-3),'};'];
        fprintf(fp,s);
    end
end
if dtype=="int8"
    if size(data,1)==1||size(data,2)==1
        fprintf(fp,['char ',char(paraname),'[]=\n']);
        s=printint8vec2char(data);
        fprintf(fp,s);
        fprintf(fp,';\n');
    elseif length(size(data))==2
        fprintf(fp,['char ',char(paraname),'[][%d]={\n'],size(data,2));
        s=[];
        for i=1:size(data,1)
            s=[s,printint8vec2char(data(i,:)),',\n'];
        end
        s=[s(1:end-3),'};'];
        fprintf(fp,s);
    end
end
if dtype=="int16"
    if size(data,1)==1||size(data,2)==1
        fprintf(fp,['short ',char(paraname),'[]=\n']);
        s=printint16vec2char(data);
        fprintf(fp,s);
        fprintf(fp,';\n');
    elseif length(size(data))==2
        fprintf(fp,['short ',char(paraname),'[][%d]={\n'],size(data,2));
        s=[];
        for i=1:size(data,1)
            s=[s,printint16vec2char(data(i,:)),',\n'];
        end
        s=[s(1:end-3),'};'];
        fprintf(fp,s);
    end
end

if dtype=="int32"
    if size(data,1)==1||size(data,2)==1
        fprintf(fp,['int ',char(paraname),'[]=\n']);
        s=printint32vec2char(data);
        fprintf(fp,s);
        fprintf(fp,';\n');
    elseif length(size(data))==2
        fprintf(fp,['int ',char(paraname),'[][%d]={\n'],size(data,2));
        s=[];
        for i=1:size(data,1)
            s=[s,printint32vec2char(data(i,:)),',\n'];
        end
        s=[s(1:end-3),'};'];
        fprintf(fp,s);
    end
end
fprintf(fp,'\n');
fclose(fp);
end

function s=printfloatvec2char(data)
    s=['{'];
    data=reshape(data,1,[]);
    numpline=4;
    num=length(data);
    lines=floor(num/numpline);
    res=num-lines*numpline;
    for i=1:lines
       for j=1:numpline
          s=[s,sprintf('%+.6e, ',data((i-1)*numpline+j))]; 
       end
       s=[s,'\n'];
    end
    if res~=0
        for j=1:res
           s=[s,sprintf('%+.6e, ',data(lines*numpline+j))]; 
        end
        s=[s(1:end-2),'}'];
    else
        s=[s(1:end-4),'}'];
    end
     
end


function s=printint8vec2char(data)
    s=['{'];
    data=reshape(data,1,[]);
    data=floor(data);
    data(data>127)=127;
    data(data<-128)=-128;
    numpline=8;
    num=length(data);
    lines=floor(num/numpline);
    res=num-lines*numpline;
    for i=1:lines
       for j=1:numpline
          s=[s,sprintf('%+4d, ',floor(data((i-1)*numpline+j)))]; 
       end
       s=[s,'\n'];
    end
    if res~=0
        for j=1:res
           s=[s,sprintf('%+4d, ',floor(data(lines*numpline+j)))]; 
        end
        s=[s(1:end-2),'}'];
    else
        s=[s(1:end-4),'}'];
    end
end

function s=printint16vec2char(data)
    s=['{'];
    data=reshape(data,1,[]);
    data=floor(data);
    data(data>32767)=32767;
    data(data<-32768)=-32768;
    numpline=8;
    num=length(data);
    lines=floor(num/numpline);
    res=num-lines*numpline;
    for i=1:lines
       for j=1:numpline
          s=[s,sprintf('%+6d, ',floor(data((i-1)*numpline+j)))]; 
       end
       s=[s,'\n'];
    end
    if res~=0
        for j=1:res
           s=[s,sprintf('%+6d, ',floor(data(lines*numpline+j)))]; 
        end
        s=[s(1:end-2),'}'];
    else
        s=[s(1:end-4),'}'];
    end
end

function s=printint32vec2char(data)
    s=['{'];
    data=reshape(data,1,[]);
    data=floor(data);
    data(data>2^31-1)=2^31-1;
    data(data<-2^31)=-2^31;
    numpline=4;
    num=length(data);
    lines=floor(num/numpline);
    res=num-lines*numpline;
    for i=1:lines
       for j=1:numpline
          s=[s,sprintf('%+11d, ',floor(data((i-1)*numpline+j)))]; 
       end
       s=[s,'\n'];
    end
    if res~=0
        for j=1:res
           s=[s,sprintf('%+11d, ',floor(data(lines*numpline+j)))]; 
        end
        s=[s(1:end-2),'}'];
    else
        s=[s(1:end-4),'}'];
    end
end



